import requests
import json
import logging

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')


class BaiduTranslate(object):
    BASE_URL = "https://fanyi.baidu.com/transapi"
    USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'

    def __init__(self, query):
        self._validate_query(query)
        self.query = query
        self.url = self.BASE_URL
        self.header = {
            'User-Agent': self.USER_AGENT,
        }
        self.data = self._build_data()

    def _validate_query(self, query):
        """
        验证查询字符串的有效性。

        此方法主要进行两项检查：
        1. 确保查询字符串不是None且确实是字符串类型。
        2. 确保查询字符串在去除前后空格后不为空。

        参数:
        query (str): 需要验证的查询字符串。

        异常:
        ValueError: 如果查询不是字符串类型或为空，则抛出ValueError。
        """
        # 检查query是否为字符串类型
        if not isinstance(query, str):
            raise ValueError("Query must be a string")
        # 检查query是否为空
        if not query.strip():
            raise ValueError("Query cannot be empty")

    def _build_data(self):
        return {
            'from': 'en',
            'query': self.query,
            'source': 'txt',
            'to': 'zh'
        }

    def run(self):
        """
            发送 POST 请求并处理响应的 JSON 数据。
            该方法首先构造一个 POST 请求，然后处理响应结果，解析 JSON 数据，并提取所需的字段。
        """
        try:
            # 发送 POST 请求
            response = requests.post(url=self.url, data=self.data, headers=self.header, verify=True)
            response.raise_for_status()  # 检查请求是否成功 如果响应的状态码不是 2xx 范围内的状态码（即表示成功的状态码），则会抛出一个 HTTPError 异常。
            r = response.json()
        except requests.RequestException as e:
            logging.error(f"Request failed: {e}")
            return
        except ValueError as e:
            logging.error(f"JSON decoding failed: {e}")
            return

        # 解析外层 JSON
        result_str = r.get('result')
        logging.info(f"Result String: {result_str}")
        # 检查 result_str 是否存在且为非空字符串
        if not result_str:
            logging.warning("No 'result' field found or it is empty.")
            return
        try:
            # 解析内层 JSON
            result_json = json.loads(result_str)
        except json.JSONDecodeError as e:
            logging.error(f"Inner JSON decoding failed: {e}")
            return

        # 访问具体字段
        content = result_json.get('content')
        voice = result_json.get('voice')

        # 打印内层解析结果
        logging.info(f"Content: {content}")
        logging.info(f"Voice: {voice}")

        # 提取中文文本
        if content and len(content) > 0:
            mean_list = content[0].get('mean', [])
            if mean_list and len(mean_list) > 0:
                cont_dict = mean_list[0].get('cont', {})
                chinese_texts = list(cont_dict.keys())
                logging.info(f"Extracted Chinese Texts: {chinese_texts}")
            else:
                logging.warning("No valid 'cont' field found in mean list.")
        else:
            logging.warning("No 'content' field found in result or it is not a list.")


if __name__ == '__main__':
    baidu_translate = BaiduTranslate("love")
    print(baidu_translate.query)
    baidu_translate.run()
